/**
 * 微信公众号授权工具类 - 精简版
 * 只保留通过 code 获取 UID 的核心功能
 */

import request from '@/api/index'

const WECHAT_CONFIG = {
  appid: 'wx8bd09d22fc7fc77c',
  scope: 'snsapi_base', // 静默授权
  state: 'STATE'
}

const STORAGE_KEY = 'activity_h5_user_id'

class WechatAuth {
  constructor() {
    this.isWechat = this.checkIsWechat()
    this.isAuthorizing = false  // 防止重复授权
  }

  /**
   * 检查是否在微信浏览器中
   */
  checkIsWechat() {
    const ua = navigator.userAgent.toLowerCase()
    return ua.indexOf('micromessenger') !== -1
  }

  /**
   * 从URL中获取参数
   */
  getUrlParam(name) {
    const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)')
    const r = window.location.search.substr(1).match(reg)
    if (r != null) return decodeURIComponent(r[2])
    return null
  }

  /**
   * 获取UID（从缓存）
   */
  getUid() {
    const cachedUid = localStorage.getItem(STORAGE_KEY)
    
    // ✅ 修复：检查缓存的UID是否有效
    if (cachedUid && cachedUid !== '' && cachedUid !== 'null' && cachedUid !== 'undefined') {
      return cachedUid
    } else {
      // 如果缓存的UID无效，清除缓存
      this.clearUid()
      return null
    }
  }

  /**
   * 保存UID到缓存
   */
  saveUid(uid) {
    // ✅ 修复：只有有效的UID才保存到缓存
    if (uid && uid !== '' && uid !== null && uid !== undefined) {
      localStorage.setItem(STORAGE_KEY, uid)
      console.log('💾 UID已保存到缓存:', uid)
    } else {
      console.warn('⚠️ 尝试保存无效的UID到缓存:', uid)
      // 如果UID无效，清除缓存
      this.clearUid()
    }
  }

  /**
   * 清除UID缓存
   */
  clearUid() {
    localStorage.removeItem(STORAGE_KEY)
  }

  /**
   * 跳转到微信授权页面
   */
  redirectToAuth() {
    if (!this.isWechat) {
      console.warn('不在微信浏览器中，无法进行微信授权')
      return
    }

    // ✅ 修复：保留完整的 URL（包含所有参数）
    // 这样可以保留如 id、utm_source 等重要参数
    const redirectUri = encodeURIComponent(window.location.href)
    const authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${WECHAT_CONFIG.appid}&redirect_uri=${redirectUri}&response_type=code&scope=${WECHAT_CONFIG.scope}&state=${WECHAT_CONFIG.state}#wechat_redirect`
    
    console.log('🔐 跳转到微信授权页面')
    console.log('保留的原始URL参数:', window.location.search)
    window.location.href = authUrl
  }

  /**
   * 清除URL中的code参数
   */
  cleanUrl() {
    const url = window.location.href
    
    try {
      // ✅ 修复：只清除 URL 中的授权码（code 和 state），保留其他参数
      // 这样可以保留 id、utm_source 等重要业务参数
      const urlObj = new URL(url)
      const hasCode = urlObj.searchParams.has('code')
      const hasState = urlObj.searchParams.has('state')
      
      if (hasCode || hasState) {
        // 只删除微信授权相关参数
        urlObj.searchParams.delete('code')
        urlObj.searchParams.delete('state')
        
        const newUrl = urlObj.toString()
        console.log('清除授权码，保留其他参数')
        console.log('原始URL:', url)
        console.log('清理后URL:', newUrl)
        
        window.history.replaceState({}, document.title, newUrl)
      }
    } catch (error) {
      console.error('清除URL参数失败:', error)
      // 降级处理：如果URL对象创建失败，使用原来的方式
      const newUrl = url.split('?')[0]
      if (newUrl !== url) {
        window.history.replaceState({}, document.title, newUrl)
      }
    }
  }

  /**
   * 通过Code获取UID
   */
  async getUidByCode(code) {
    if (!code) {
      console.error('❌ 缺少code')
      return null
    }

    try {
      const response = await request({
        url: '/addons/yun_shop/api.php?i=1&scope=pass&route=plugin.activity-set.admin.wechat-auth.get-uid-by-code',
        method: 'post',
        data: { code: code }
      })

      if (response.result === 1) {
        const uid = response.data.uid
        
        // ✅ 修复：只有当UID不为空时才保存到缓存
        if (uid && uid !== '' && uid !== null && uid !== undefined) {
          this.saveUid(uid)
          console.log('✅ 获取UID成功并保存到缓存:', uid)
          return uid
        } else {
          console.warn('⚠️ 获取到的UID为空，不保存到缓存:', uid)
          return null
        }
      } else {
        console.error('❌ 获取UID失败:', response.msg)
        return null
      }
    } catch (error) {
      console.error('❌ 获取UID异常:', error)
      return null
    }
  }

  /**
   * 初始化微信授权，自动获取UID
   */
  async init(callback) {
    console.log('🚀 开始微信授权流程...')
    
    // ✅ 防止重复授权
    if (this.isAuthorizing) {
      console.log('⚠️ 正在授权中，跳过重复请求')
      return null
    }
    
    // 1. 检查是否在微信浏览器中
    if (!this.isWechat) {
      console.warn('⚠️ 不在微信浏览器中')
      if (callback) callback(null)
      return null
    }

    // 2. 检查缓存中是否已有UID
    const cachedUid = this.getUid()
    if (cachedUid) {
      console.log('✅ 使用缓存的UID:', cachedUid)
      if (callback) callback(cachedUid)
      return cachedUid
    }

    // 3. 检查URL中是否有code参数
    const code = this.getUrlParam('code')
    if (code) {
      console.log('🎫 检测到授权code')
      
      // 通过code获取UID
      const uid = await this.getUidByCode(code)
      
      // 清除URL中的code参数
      this.cleanUrl()
      
      if (uid) {
        // ✅ 成功获取UID，重置授权标记
        this.isAuthorizing = false
        if (callback) callback(uid)
        return uid
      } else {
        // ✅ 关键修复：获取UID失败时，直接返回，不再重新授权
        this.isAuthorizing = false
        console.error('❌ 获取UID失败，请刷新页面重试')
        if (callback) callback(null)
        return null  // ✅ 阻止继续执行到下面的 redirectToAuth()
      }
    }

    // 4. 没有code，跳转到微信授权页面
    this.isAuthorizing = true  // ✅ 设置授权中标记
    console.log('🔄 开始静默授权...')
    this.redirectToAuth()
    return null
  }
}

// 创建单例
const wechatAuth = new WechatAuth()

export default wechatAuth
